package thread;

/**
 *  在并发编程中，我们通常会遇到以下三个问题：原子性问题，可见性问题，有序性问题。
 *  被volatile修饰之后
 *  1）保证了不同线程对这个变量进行操作时的可见性。
 *  2）禁止进行指令重排序。(保证单线程程序最终执行结果和代码顺序执行的结果是一致的,但不保证执行顺序)
 *
 *  inc++: 不具备原子性的，它包括读取变量的原始值、进行加1操作、写入工作内存
 *
 */
public class VolatileTest {
    public volatile int inc = 0;

    public void increase() {
        inc++;
    }

    public static void main(String[] args) throws InterruptedException {
        final VolatileTest test = new VolatileTest();
        for(int i=0;i<10;i++){
            new Thread(){
                public void run() {
                    for(int j=0;j<1000;j++)
                        test.increase();
                };
            }.start();
        }

        Thread.sleep(5000);
        System.out.println(test.inc);
    }
}
